home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xearth-0.92 / extarr.c < prev    next >
C/C++ Source or Header  |  1995-06-25  |  2KB  |  92 lines

  1. /*
  2.  * extarr.c
  3.  * kirk johnson
  4.  * july 1993
  5.  *
  6.  * RCS $Id: extarr.c,v 1.3 1994/05/20 01:37:40 tuna Exp $
  7.  *
  8.  * Copyright (C) 1989, 1990, 1993, 1994 Kirk Lauritz Johnson
  9.  *
  10.  * Parts of the source code (as marked) are:
  11.  *   Copyright (C) 1989, 1990, 1991 by Jim Frost
  12.  *   Copyright (C) 1992 by Jamie Zawinski <jwz@lucid.com>
  13.  *
  14.  * Permission to use, copy, modify, distribute, and sell this
  15.  * software and its documentation for any purpose is hereby granted
  16.  * without fee, provided that the above copyright notice appear in
  17.  * all copies and that both that copyright notice and this
  18.  * permission notice appear in supporting documentation. The author
  19.  * makes no representations about the suitability of this software
  20.  * for any purpose. It is provided "as is" without express or
  21.  * implied warranty.
  22.  *
  23.  * THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  24.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
  25.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT
  26.  * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  27.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  28.  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  29.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  30.  */
  31.  
  32. #include "xearth.h"
  33. #include "kljcpyrt.h"
  34.  
  35.  
  36. ExtArr extarr_alloc(eltsize)
  37.      unsigned eltsize;
  38. {
  39.   ExtArr rslt;
  40.  
  41.   rslt = (ExtArr) malloc((unsigned) sizeof(struct extarr));
  42.   assert(rslt != NULL);
  43.  
  44.   rslt->eltsize = eltsize;
  45.   rslt->limit   = 1;
  46.   rslt->count   = 0;
  47.  
  48.   rslt->body = (void *) malloc((unsigned) eltsize*rslt->limit);
  49.   assert(rslt->body != NULL);
  50.  
  51.   return rslt;
  52. }
  53.  
  54.  
  55. void extarr_free(x)
  56.      ExtArr x;
  57. {
  58.   free(x->body);
  59.   free(x);
  60. }
  61.  
  62.  
  63. void *extarr_next(x)
  64.      ExtArr x;
  65. {
  66.   unsigned eltsize;
  67.   unsigned limit;
  68.   unsigned count;
  69.   void    *body;
  70.   void    *rslt;
  71.  
  72.   eltsize = x->eltsize;
  73.   limit   = x->limit;
  74.   count   = x->count;
  75.   body    = x->body;
  76.  
  77.   if (count == limit)
  78.   {
  79.     limit *= 2;
  80.     body   = (void *) realloc(body, (unsigned) eltsize*limit);
  81.     assert(body != NULL);
  82.  
  83.     x->limit = limit;
  84.     x->body  = body;
  85.   }
  86.  
  87.   rslt = (void *) ((char *) body + (count * eltsize));
  88.   x->count = count + 1;
  89.  
  90.   return rslt;
  91. }
  92.